1 Wprowadzenie

W tej pracy dowmowej sprawdzimy jak różnią sie algoytmy k-means i k-metoids. Będziemy korzystać z funkcji eclust, w niej można wybrać jakie algotrymy będziemy używać.

Najpierw sprawdźmy jak wyglądają różne podziały.

grid.arrange(pkmeans2,ppam2, pkmeans3,ppam3,
             nrow = 2)

grid.arrange(pkmeans4,ppam4, pkmeans5,ppam5,
             nrow = 2)

grid.arrange(pkmeans6,ppam6, pkmeans7,ppam7,
             nrow = 2)

grid.arrange(pkmeans8,ppam8, pkmeans8,ppam8,
             nrow = 2)

grid.arrange(pkmeans10,ppam10,
             nrow = 1)

Widać na oko, że najsensowniejszy jest podział na 2 klastry, zweryfikujemy to jeszcze.

2 Optymalna licza klastrów

Sprawdzimy na pare sposobów jaka liczba klastrów jest najlepsza dla tego zbioru i tych algorytmów.

fviz_nbclust(data, kmeans, method = "wss") +
    geom_vline(xintercept = 2, linetype = 2)+
  labs(title = "Elbow method", subtitle = "for Kmeans")

fviz_nbclust(data, pam, method = "wss") +
    geom_vline(xintercept = 2, linetype = 2)+
  labs(title = "Elbow method", subtitle = "for Pam")

Z tych wykresów widać, że rzeczywiście liczba klastrów równa dwa jest optymalna, przyjżyjmy się jeszcze innym statystykom.

op <- par(no.readonly=TRUE)
par(mfrow=c(2,2),mar=c(4,4,3,1))
plot(wiedza, legend=FALSE)
plot(nClusters(wiedza),measures(wiedza,"Dunn")[,,1],type="n",axes=F,xlab="",ylab="")
legend("center", clusterMethods(wiedza), col=1:9, lty=1:9, pch=paste(1:9))

Po przyjrzeniu się tym wykresom już nie ma wątpliwości, że optymalna liczba to 2. Widać, również że algorytm k-means okazał się lepszy pod względem dwóch statystyk, można zatem postawić hipotezę, że jest ogólnie lepszy, a co za tym idzie będzie szybciej zbiegał.

3 Porównanie klastrów i ich centrów

fviz_cluster(kmeans2, geom = "point", data = data, shape = 20, show.clust.cent=TRUE,
             stand=T, pointsize = 3, ellipse.type='confidence') +
  ggtitle("kmeans k = 2") + theme(legend.position = "none") + xlab("")

fviz_cluster(pam2, geom = "point", data = data, shape = 20, show.clust.cent=TRUE,
             stand=T, pointsize = 3, ellipse.type='confidence') +
  ggtitle("kmeans k = 2") + theme(legend.position = "none") + xlab("")

Jeżeli chodzi o podział zbioru, to lepiej wypada algorytm kmeans. Podział otrzymany w ten sposób jest dużo bardziej rozłączny, co widać gołym okiem.

Centra nie znajdują się w dokładnie tych samych miejscach, ale żeby to zauważyć trzeba się mocno przyjżejć.

4 Szybkość zbieżności

W celu porównania szybkości zbieżności tych algorytmów zrobimy benchmark dla 200 wywołań.

kable_styling(kable(benchmark("kmeans" = {
           hc <- data %>% eclust("kmeans", k = 2, graph = FALSE)
          },'pam'= {
          hc <- data %>% eclust("pam", k = 2, graph = FALSE)
          },
          replications = 200,
          columns = c("test", "replications", "elapsed",
                      "relative", "user.self", "sys.self"))))
test replications elapsed relative user.self sys.self
kmeans 200 4.157 1.000 1.814 0.557
pam 200 4.731 1.138 3.169 0.526

Widać, że zdecydowanie szybszy jest algorytm kmeans, potwierdza to naszą hipoteze z wczesniej, że w tym konkretnym przypadku jest lepszy.